﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataLayer.EF;
using EntityLayer;
using System.Data.SqlClient;

namespace DataLayer.CLASES_DAO
{
    public class clsT_OrdenCompraDAO
    {
        private BD_GESTIONACTIVOSEntities ContextoDeObjs = new BD_GESTIONACTIVOSEntities();
        public bool Insertar(T_Orden_Compra obj)
        {
            try
            {
                ContextoDeObjs.AddObject("T_Orden_Compra", obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception ex)
            {
                return false;
                throw;
            }
            return true;
        }

        public bool Modificar(T_Orden_Compra obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_Orden_Compra", obj);
                ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception ex)
            {
                return false;
                throw;

            }
            return true;
        }
        public bool Eliminar(T_Orden_Compra obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_Orden_Compra", obj);
                ContextoDeObjs.DeleteObject(obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
                throw;
            }
            return true;
        }
        public List<T_Orden_Compra> listarOrdenCompra()
        {

            List<T_Orden_Compra> lista = new List<T_Orden_Compra>();
            try
            {
                var q = from c in ContextoDeObjs.T_Orden_Compra
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }
        public List<T_Orden_Compra> listarOrdenCompraxID(string id)
        {

            List<T_Orden_Compra> lista = new List<T_Orden_Compra>();
            try
            {
                var q = from c in ContextoDeObjs.T_Orden_Compra
                        where c.NumeroOrdenCompra == id
                        select c;
                lista = q.ToList();

            }
            catch (Exception)
            {
                lista = null;
                throw;
            }
            return lista;
        }

        public string ObtenerNroOrdenCompraMax()
        {
            long id_opcion = 0;
            string cod;

            try
            {
                var q = (from c in ContextoDeObjs.T_Orden_Compra
                         select c.NumeroOrdenCompra).DefaultIfEmpty("00000000").Max();

                id_opcion = Convert.ToInt32(Right(q, 8)) + 1;
                cod = "000000000000" + id_opcion;
                cod = "OC" + Right(cod, 8);
                return cod;
            }
            catch (Exception ex)
            {
                return "";
                throw;
            }
        }
        public static string Right(string param, int length)
        {

            int value = param.Length - length;
            string result = param.Substring(value, length);
            return result;
        }

        public List<T_Orden_Compra> ListarOrdenComprasXFechas(DateTime fechaini, DateTime fechafin)
        {
            List<T_Orden_Compra> lista = new List<T_Orden_Compra>();
            try
            {
                var q = from o in ContextoDeObjs.T_Orden_Compra
                        where (o.FechaRequerida >= fechaini && o.FechaRequerida <= fechafin)
                        //where o.FechaRequerida <= fechafin
                        select o;
                lista = q.ToList();
            }
            catch (Exception ex)
            {
                throw;
            }

            return lista;
        }

        public IEnumerable<Object> ListarOrdenComprasXRangoFechas(DateTime fechaini, DateTime fechafin,bool estado)
        {
            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from o in ContextoDeObjs.T_Orden_Compra
                        from p in ContextoDeObjs.T_Programa
                        from a in ContextoDeObjs.T_Area
                        from s in ContextoDeObjs.T_Solicitud_Adquisicion
                        from u in ContextoDeObjs.T_Usuario_Sistema
                        where o.NumeroSolicitud == s.NumeroSolicitud &&
                        s.CodigoUsuario == u.CodigoUsuario &&
                        s.CodigoPrograma == p.CodigoPrograma &&
                        u.CodigoArea == a.CodigoArea &&
                        (o.FechaRequerida >= fechaini && o.FechaRequerida <= fechafin) && 
                        o.estado==estado
                        //where o.FechaRequerida <= fechafin
                        select new
                        {
                            NumeroOrdenCompra=o.NumeroOrdenCompra,
                            codigo=o.NumeroOrdenCompra==null?null:o.NumeroOrdenCompra.Substring(6,4),
                            o.NumeroCuenta,
                            NumeroLicencias = o.NumeroLicencias,
                            o.Sustento,
                            o.FechaRequerida,
                            o.estado,
                            o.NumeroSolicitud,
                            o.CodigoBaseTecnica,
                            o.CodigoRequerimiento,
                            a.CodigoArea,
                            a.NombreArea,
                            u.CodigoUsuario,
                            u.NombreUsuario,
                            u.ApellidoUsuario,
                            p.CodigoPrograma,
                            p.NombrePrograma
                        };
                lista = q.ToList();
            }
            catch (Exception ex)
            {
                throw;
            }

            return lista;
        }

        public List<ListadoOrdenCompra> ListarOrdenComprasCompleto(string idOrdenCompra)
        {
            List<ListadoOrdenCompra> lista = new List<ListadoOrdenCompra>();
            try
            {
                var q = from o in ContextoDeObjs.T_Orden_Compra
                        from p in ContextoDeObjs.T_Programa
                        from a in ContextoDeObjs.T_Area
                        from s in ContextoDeObjs.T_Solicitud_Adquisicion
                        from  u in ContextoDeObjs.T_Usuario_Sistema
                        where o.NumeroSolicitud == s.NumeroSolicitud &&
                        s.CodigoUsuario == u.CodigoUsuario &&
                        s.CodigoPrograma == p.CodigoPrograma &&
                        u.CodigoArea == a.CodigoArea && 
                        o.NumeroOrdenCompra==idOrdenCompra
                        //where o.FechaRequerida <= fechafin
                        select new
                        {
                            NumeroOrdenCompra = o.NumeroOrdenCompra,
                            o.NumeroCuenta,
                            NumeroLicencias = o.NumeroLicencias,
                            o.Sustento,
                            o.FechaRequerida,
                            o.estado,
                            o.NumeroSolicitud,
                            o.CodigoBaseTecnica,
                            o.CodigoRequerimiento,
                            a.CodigoArea,
                            a.NombreArea,
                            p.CodigoPrograma,
                            p.NombrePrograma
                        };

                ListadoOrdenCompra item = new ListadoOrdenCompra();
                foreach (var s in q.AsEnumerable())
                { 
                item.NumeroOrdenCompra=s.NumeroOrdenCompra;
                item.NumeroCuenta = s.NumeroCuenta;
                item.NumeroLicencias = Convert.ToInt32(s.NumeroLicencias);
                item.Sustento = s.Sustento;
                item.FechaRequerida = Convert.ToDateTime(s.FechaRequerida);
                item.estado = Convert.ToBoolean(s.estado);
                item.NumeroSolicitud = s.NumeroSolicitud;
                item.CodigoBaseTecnica = s.CodigoBaseTecnica;
                item.CodigoRequerimiento = s.CodigoRequerimiento;
                item.CodigoArea = s.CodigoArea;
                item.NombreArea = s.NombreArea;
                item.CodigoPrograma = s.CodigoPrograma;
                item.NombrePrograma = s.NombrePrograma;
                lista.Add(item);
                }

            }
            catch (Exception ex)
            {
                throw;
            }

            return lista;
        }

        public bool actualizarOrdenCompra(string idRequerimientoFunc, string idBaseTecnica, string NumeroOrdenCompra)
        {
            bool flag = false;
             try
            { 
            if (idRequerimientoFunc == null)
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_Orden_Compra SET CodigoBaseTecnica= '{0}' WHERE NumeroOrdenCompra='{1}'", idBaseTecnica, NumeroOrdenCompra));
                flag = true;
            }
            else if (idBaseTecnica == null)
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_Orden_Compra SET CodigoRequerimiento= '{0}' WHERE NumeroOrdenCompra='{1}'", idRequerimientoFunc, NumeroOrdenCompra));
                flag= true;
            }
            }
            catch (SqlException ex)
            {
                throw;
            }
             return flag;
        }


public bool actualizarOrdenCompraCompleto(int numeroLicencias, string sustento, string numeroCuenta,string fecharequerida,string numeroOrdenCompra)
        {
            bool flag = false;
             try
            { 
         
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_Orden_Compra SET NumeroLicencias= {0} , Sustento= '{1}' , NumeroCuenta= '{2}' , FechaRequerida= '{3}' WHERE NumeroOrdenCompra= '{4}' ", numeroLicencias, sustento,numeroCuenta,fecharequerida,numeroOrdenCompra));
                flag = true;
            }
            catch (SqlException ex)
            {
                throw;
            }
             return flag;
        }

public IEnumerable<Object> listaPropuestaXOrdencompra(string ordencompra)
{
    IEnumerable<Object> lista = new List<Object>();
    try
    {
        var q = from oc in ContextoDeObjs.T_Orden_Compra
                from pr in ContextoDeObjs.T_Propuesta
                from pro in ContextoDeObjs.T_Programa
                from sol in ContextoDeObjs.T_Solicitud_Adquisicion
                where oc.CodigoPropuesta == pr.CodigoPropuesta &&
                oc.NumeroSolicitud == sol.NumeroSolicitud && 
                pro.CodigoPrograma==sol.CodigoPrograma
                select new
                {
                    oc.NumeroOrdenCompra,
                    pr.CodigoPropuesta,
                    pr.CodigoProveedor,
                    pr.Estado,
                    estadopropuesta=pr.Estado==false?"Pendiente":"Autorizada",
                    pr.Fecha,
                    pro.CodigoPrograma,
                    pro.NombrePrograma
                    
                };

        lista = q.ToList();
    }
    catch (Exception)
    {
        throw;
    }

    return lista;
}

public bool actualizarOrdenCompraPropuesta(string idPropuesta, string NumeroOrdenCompra)
{
    bool flag = false;
    try
    {
        
            ContextoDeObjs.CommandTimeout = 600;
            ContextoDeObjs.ExecuteStoreCommand(String.Format("UPDATE T_Orden_Compra SET CodigoPropuesta= '{0}' WHERE NumeroOrdenCompra='{1}'", idPropuesta, NumeroOrdenCompra));
            flag = true;
      
     
    }
    catch (SqlException ex)
    {
        throw;
    }
    return flag;
}
    }
}
